iT邦幫忙

0

30天Leetcode挑戰(6):1793 Maximum score of a good subarray

  • 分享至 

  • xImage
  •  

碎碎念

這應該是一兩天前的,但因為那幾天忙碌就沒有記下來了。這一題可難可簡單,我是先用了笨方法然後吃到超時,然後請GPT改成快一點的方法(蠻猛的)

提案

這題也是閱讀測驗題,給定list,找出飽含指定索引k的元素的最高分的子陣列
最高分的定義="子序列的長度(len(array))"乘以"子序列的最小元素(min(array))"
這個大概看範例就懂了

解題絲路

我的原始做法是跑一個雙層迴圈,一次向左,一次向右,然後就可以跑完所有的array可能性

‵‵‵
class Solution:
    def maximumScore(self, nums: list[int], k: int) -> int:
        max_product = -1  # 初始化為-1,因為我們處理的是正整數
        n = len(nums)
        haha = 0
        for start in range(0, k + 1):  # start不應超過k
            for end in range(k, n):  # end至少需要從k開始
                sublist = nums[start:end + 1]
                current_product = min(sublist) * len(sublist)
                max_product = max(max_product, current_product)
                print(sublist)
        return max_product

但花的時間太多了,可是我又非得把所有的都歷遍過
於是我就叫AI

class Solution:
    def maximumScore(self, nums: list[int], k: int) -> int:
        max_product = nums[k]  # 初始化为 nums[k],因为我们处理的是正整数,nums[k] 是有效子序列的一部分
        min_value = nums[k]  # 当前的最小值初始化为 nums[k]
        left = right = k  # 从索引 k 开始向两边扩展

        while left > 0 or right < len(nums) - 1:  # 当左边或右边有更多元素时继续
            # 如果左边没有更多元素,或者右边的元素更大,则向右移动
            if left == 0 or (right < len(nums) - 1 and nums[left - 1] < nums[right + 1]):
                right += 1
                min_value = min(min_value, nums[right])
            else:  # 否则,向左移动
                left -= 1
                min_value = min(min_value, nums[left])

            current_product = min_value * (right - left + 1)  # 计算当前子序列的乘积
            max_product = max(max_product, current_product)  # 更新最大乘积

        return max_product

他用if直接左右擴,然後就過了
我對於記憶體跟時間消耗的部分不是很懂啦
為甚麼這樣比較快呢???


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言